#include "insertionsort.h"

// 构造函数：初始化 bars 为包含颜色的结构体，并将指针 j 初始化为 i（从第 1 个元素开始插入）
InsertionSort::InsertionSort(const QVector<int> &values) {
    for (int v : values)
        bars.append({v, Qt::lightGray});
    j = i; // i 默认初始化为 1
}

// 执行插入排序的一个操作步骤
void InsertionSort::step() {
    // 排序已完成，或者 i 超出范围
    if (sorted || i >= bars.size()) {
        sorted = true;
        return;
    }

    // 每步开始前清空所有颜色
    for (auto &bar : bars)
        bar.color = Qt::lightGray;

    // 当前元素 j 和前一个元素 j-1 比较，根据排序方向决定是否交换
    if (j > 0 &&
        ((sortOrder == SortOrder::Ascending && bars[j - 1].value > bars[j].value) ||
         (sortOrder == SortOrder::Descending && bars[j - 1].value < bars[j].value))) {
        bars[j - 1].color = Qt::red;     // 当前比较的元素
        bars[j].color = Qt::green;       // 被移动的元素
        std::swap(bars[j], bars[j - 1]); // 执行交换
        swapCount++;
        compareCount++;
        j--; // 继续向前比较
    } else {
        i++;  // 当前元素已插入到正确位置，处理下一个元素
        j = i;
    }
}

// 判断排序是否完成
bool InsertionSort::isFinished() const {
    return sorted;
}

// 返回当前的排序数据（用于可视化）
const QVector<SortBar>& InsertionSort::getData() const {
    return bars;
}

// 获取并重置当前步的比较次数
int InsertionSort::getAndResetCompareCount() {
    int c = compareCount;
    compareCount = 0;
    return c;
}

// 获取并重置当前步的交换次数
int InsertionSort::getAndResetSwapCount() {
    int s = swapCount;
    swapCount = 0;
    return s;
}

// 返回插入排序的时间复杂度描述
QString InsertionSort::getComplexityInfo() const {
    return "平均 O(n²)，最好 O(n)，最坏 O(n²)，空间复杂度 O(1)";
}

// 设置排序方式（升序或降序）
void InsertionSort::setOrder(SortOrder order) {
    sortOrder = order;
}
